/**
	@class
	ReqMgr Singleton.
	Instância "Req's" e gerencia as mesmas.
	Tem também o poder de empilhar requisições para economia de banda e gerenciar
	melhor requisições assíncronas.
	@see Req
*/
var ReqMgr = new function ()
{
	this.reqStack = new Array ();

	this.init = function ()
	{
		setInterval ("ReqMgr.timer();", DEF_REQ_QUEUE_TIMER_INTERVAL * 1000);
	}

	/**
		Recebe os dados de uma requisição a ser realizada e gerencia seu andamento.
		@see Req
	*/
	this.queue = function (args)
	{
		var req = new Req (args);

		if (req.type == NAME_REQ_TYPE_SYNC || req.type == NAME_REQ_TYPE_ASYNC_MNGD)
			req.go ();
		else if (req.type == NAME_REQ_TYPE_ASYNC_IGNR)
			this.reqStack.push (req);

		this.goStack (false);
	}

	/**
		Método executado periodicamente para lançar as requisições no backend,
		quando aplicável.
		@param force Força a ida das requisições independente de tempo e tamanho da pilha
	*/
	this.goStack = function (force)
	{
		if (!force && this.reqStack.length < DEF_REQ_QUEUE_MAX_COUNT)
			return;

		if (this.reqStack.length)
		{
			var stackParams = new Array ();

			for (var i = 0; i < this.reqStack.length; i++)
				stackParams.push (this.reqStack[i].params);

			Ext.Ajax.request ({
				url: DEF_REQ_URL,
				callback: this.ajaxStackCallback,
				scope: this,
				jsonData: stackParams
			});
		}
	}

	/**
		Callback do stack de requisições.
		@see Req#ajaxCallback
		@see ReqMgr#goStack
	*/
	this.ajaxStackCallback = function (options, success, response)
	{
		var data = Ext.util.JSON.decode (response.responseText);

		// Assumimos que data será um array do mesmo tamanho de reqStack (backend opera desta forma)
		for (var i = 0; i < this.reqStack.length; i++)
		{
			this.reqStack[i].ajaxCallback.call (this.reqStack[i], options, success, data[i]);
			this.reqStack[i] = null;
		}

		this.reqStack = new Array ();
	}

	/**
		Registra operações periódicas do sistema
	*/
	this.timer = function ()
	{
		this.goStack (true);
	}

	this.init ();
}
